import CodeBlock from "@theme/CodeBlock";


# 事件 / 回调

LangChain 提供了一个回调系统，允许你在 LLM 应用程序的各个阶段中进行钩子处理。这对于记录日志、[监视](../tracing)、[流媒体](../../modules/models/llms/additional_functionality#streaming-responses)和其他任务非常有用。

你可以通过 API 中使用的 `callbacks` 参数来订阅这些事件。此方法接受一个处理程序对象的列表，这些对象应该实现 [API 文档](../../api/callbacks/interfaces/CallbackHandlerMethods) 中描述的一个或多个方法。

## 深入了解

import DocCardList from "@theme/DocCardList";


<DocCardList />


## 如何使用回调

在 API 中的大多数对象上（[Chains](../../modules/chains/)、[Models](../../modules/models/)、[Tools](../../modules/agents/tools/)、[Agents](../../modules/agents/agents/) 等)都提供了 `callbacks` 参数，它有两个不同的用法:

### 构造器回调

在构造函数中定义，如 `new LLMChain({ callbacks: [handler] })`，将用于该对象上进行的所有调用，并且仅适用于该对象本身。例如，如果你将处理程序传递给 `LLMChain` 构造函数，则不会被连接到该链上的模型使用。

import ConstructorExample from "!!raw-loader!@examples/callbacks/docs_constructor_callbacks.ts";


<CodeBlock language="typescript">{ConstructorExample}</CodeBlock>


### 请求回调

在发出请求的 `call()`/`run()`/`apply()` 方法中定义，例如 `chain.call({ input: '...' }， [handler])`，将仅用于该特定请求及其包含的所有子请求（例如，对 LLMChain 的调用会触发对模型的调用，该模型使用在 `call()` 方法中传递的相同处理程序)。

import RequestExample from "!!raw-loader!@examples/callbacks/docs_request_callbacks.ts";


<CodeBlock language="typescript">{RequestExample}</CodeBlock>


### 详细模式


`verbose`参数可用于API中的大部分对象（链接，模型，工具，代理等)作为构造参数。例如，`new LLMChain({ verbose: true })`，它相当于将`callbacks`参数传递给该对象和所有子对象的`ConsoleCallbackHandler`。这对于调试非常有用，因为它会将所有事件记录在控制台上。您还可以通过设置环境变量`LANGCHAIN_VERBOSE=true`来为整个应用程序启用详细模式。


import VerboseExample from "!!raw-loader!@examples/callbacks/docs_verbose.ts";



<CodeBlock language="typescript">{VerboseExample}</CodeBlock>



### 你何时需要使用它们？


- 构造函数回调最适用于诸如日志记录，监视等用例，这些用例不特定于单个请求，而是适用于整个链。例如，如果您要记录所有发送到LLMChain的请求，则应将处理程序传递给构造函数。
- 请求回调最适用于流式传输等用例，其中您需要将单个请求的输出流到特定的websocket连接或其他类似的用例。例如，如果您想将单个请求的输出流到websocket，则应将处理程序传递给`call()`方法。


## 使用示例


### 内置处理程序


LangChain提供了一些内置处理程序，可用于入门。这些可在`langchain/callbacks`模块中使用。最基本的处理程序是`ConsoleCallbackHandler`，只需将所有事件记录到控制台即可。在将`verbose`标志设置为`true`的情况下，`ConsoleCallbackHandler`将在不显式传递的情况下被调用。


import ConsoleExample from "!!raw-loader!@examples/callbacks/console_handler.ts";



<CodeBlock language="typescript">{ConsoleExample}</CodeBlock>



### One-off handlers



您可以通过将普通对象传递给`callbacks`参数来创建一个临时处理程序。该对象应实现[`CallbackHandlerMethods`](../../api/callbacks/interfaces/CallbackHandlerMethods)接口。如果您需要创建一个仅用于单个请求的处理程序，这将非常有用，例如流式传输LLM / Agent /等的输出到WebSocket。


import StreamingExample from "!!raw-loader!@examples/models/llm/llm_streaming.ts";



<CodeBlock language="typescript">{StreamingExample}</CodeBlock>



### 多个处理程序


我们在`CallbackManager`类上提供了一种方法，允许您创建一个临时处理程序。如果您需要创建一个仅用于单个请求的处理程序，这将非常有用，例如流式传输LLM / Agent /等的输出到WebSocket。


This is a more complete example that passes a `CallbackManager` to a ChatModel, and LLMChain, a Tool, and an Agent.



import AgentExample from "!!raw-loader!@examples/agents/streaming.ts";



<CodeBlock language="typescript">{AgentExample}</CodeBlock>

